﻿using System.Collections.Generic;
using User.EF.Model;

namespace User.EF.Contracts
{
    /// <summary>
    /// Alle Abfragen die mit der Rechteverwaltung zusammenhängen.
    /// Wichtig ist dabei, das ein User nur das Recht hat, wenn es Ihm auch entsprechend zugewiesen wurde. Ist einem User ein Recht nicht zugewiesen, dann hat er dieses Recht auch nicht.
    /// </summary>
    public interface IRightQueries
    {
        /// <summary>
        /// Der Aktuelle context über den die Daten abgerufen werden können
        /// </summary>
        MainModelContainer Context { get; }
       
        /// <summary>
        /// Speichern der Einstellungen
        /// </summary>
        /// <returns></returns>
        bool Save();

        /// <summary>
        /// Prüft ob die Übergebene UserId das Admin Right hat.
        /// </summary>
        /// <param name="userId">Die UserId die überprüft werden soll</param>
        /// <returns>TRUE->Hat das Admin Recht | FALSE->Hat kein Admin Recht</returns>
        bool IsAdmin(long userId);

        /// <summary>
        /// Ermittelt Alle Rechte der übergebenen UserId
        /// </summary>
        /// <param name="userId">Die UserId für die alle Rechte ermittelt werden sollen</param>
        List<EMemberRight> UserRights(long userId);

        /// <summary>
        /// Prüfen ob der User das übergebene Userrecht hat oder nicht.
        /// </summary>
        /// <param name="userId">Die UserId die überprüft werden soll</param>
        /// <param name="userRight">Das passende Recht nach dem gesucht wird.</param>
        /// <returns>TRUE->Hat das Recht | FALSE->Hat nicht das Recht</returns>
        bool HasRight(long userId, EMemberRight userRight);

        /// <summary>
        /// Dem User das Recht zuweisen.
        /// </summary>
        /// <param name="userId">Die UserId der das Recht zugewiesen werden soll</param>
        /// <param name="userRight">Das Recht das dem User zugewiesen werden soll</param>
        bool AddRight(long userId, EMemberRight userRight);

        /// <summary>
        /// Das Recht vom User entfernen
        /// </summary>
        /// <param name="userId">Die UserId der das Recht entzogen werden soll</param>
        /// <param name="userRight">Das Recht welches entzogen werden soll</param>
        /// <returns>TRUE->Erfolgreich entfernt | FALSE->Fehler beim Entfernen des Rechts</returns>
        bool RemoveRight(long userId, EMemberRight userRight);

        /// <summary>
        /// Hinzufügen der Standardrechte für das Vocabelmodul
        /// </summary>
        /// <param name="userId">die UserId der die Rechte hinzugefügt werden sollen</param>
        void AddDefaultVocabelRights(long userId);
    }
}
